/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   15-1-10 下午1:45 Created by dwzhang
 */
package com.jade.framework.base.vfile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.jade.framework.base.context.ApplicationContextUtils;
import com.jade.framework.base.util.Parameters;

/**
 * VFile的工具类。
 *
 * @author <a href="mailto:dwzhang@xunton.com">dwzhang</a> 
 * @version 1.0 15-1-10 下午1:45
 */
public class VFileUtils
{
    private static VFileStorage storage = null;
    private static VFileURIGetter uriGetter = null;

    public static VFileStorage getStorage()
    {
        if (storage == null) {
            storage = ApplicationContextUtils.getBean("system_vfileStorage");
        }
        return storage;
    }

    protected static VFileURIGetter getURIGetter()
    {
        if (uriGetter == null) {
            uriGetter = ApplicationContextUtils.getBean("system_vfileURIGetter");
        }
        return uriGetter;
    }

    /**
     * 根据数据类型获取文件管理器.
     *
     * @param dataType 数据类型
     * @return 文件管理器。
     */
    public static VFileManager getFileManager(String dataType)
    {
        return getStorage().getFileManager(dataType);
    }

    public static VFileManager getFileManager(String dataType, Parameters parameters)
    {
        return getStorage().getFileManager(dataType, parameters);
    }

    /**
     * 上传本地文件。
     *
     * @param dataType 数据类型
     * @param localFile 本地文件
     * @return 文件信息对象
     * @throws java.io.IOException　处理异常
     */
    public static VFileInfo uploadFile(String dataType, File localFile)
            throws IOException
    {
        return getFileManager(dataType).uploadFile(dataType, localFile);
    }

    /**
     * 根据输入流上传文件。
     *
     * @param info 文件信息
     * @param is 输入流
     * @return 文件信息对象
     * @throws IOException　处理异常
     */
    public static VFileInfo uploadFile(VFileInfo info, InputStream is)
            throws IOException
    {
        return getFileManager(info.getDataType()).uploadFile(info, is);
    }

    public static VFileInfo uploadFile(String dataType, String contentType, String fileName, InputStream is)
            throws IOException
    {
        VFileInfo fileInfo = createFileInfo(dataType, contentType, fileName);
        return uploadFile(fileInfo, is);
    }

    /**
     * 直接上传数据到文件中。
     *
     * @param info　文件信息
     * @param data　文件数据
     * @param offset　偏移量
     * @param length　数据大小
     * @return 文件信息大小
     * @throws IOException
     */
    public static VFileInfo uploadFile(VFileInfo info, byte[] data, int offset, int length)
            throws IOException
    {
        return getFileManager(info.getDataType()).uploadFile(info, data, offset, length);
    }

    public static VFileInfo uploadFile(String dataType, String contentType, String fileName, byte[] data)
            throws IOException
    {
        return uploadFile(dataType, contentType, fileName, data, 0, data.length);
    }

    public static VFileInfo uploadFile(String dataType, String contentType, String fileName, byte[] data, int offset,
                                       int length)
            throws IOException
    {
        VFileInfo fileInfo = createFileInfo(dataType, contentType, fileName);
        return uploadFile(fileInfo, data, offset, length);
    }

    /**
     * 直接上传数据到文件中。
     *
     * @param info　文件信息
     * @param data　文件数据
     * @return 文件信息大小
     * @throws IOException
     */
    public static VFileInfo uploadFile(VFileInfo info, String data, String encoding)
            throws IOException
    {
        byte[] bytes = data.getBytes(encoding);
        return getFileManager(info.getDataType()).uploadFile(info, bytes, 0, bytes.length);
    }

    public static VFileInfo uploadFile(String dataType, String contentType, String fileName, String data,
                                       String encoding)
            throws IOException
    {
        VFileInfo fileInfo = createFileInfo(dataType, contentType, fileName);
        return uploadFile(fileInfo, data, encoding);
    }

    protected static VFileInfo createFileInfo(String dataType, String contentType, String fileName)
    {
        VFileInfo fileInfo = new VFileInfo();
        fileInfo.setDataType(dataType);
        fileInfo.setFileName(fileName);
        fileInfo.setContentType(contentType);
        return fileInfo;
    }

    /**
     * 根据文件ID获取文件信息．
     *
     * @param dataType 数据类型
     * @param id　文件ID
     * @return 文件信息对象
     * @throws IOException
     */
    public static VFileInfo getFileInfo(String dataType, String id)
            throws IOException
    {
        return getFileManager(dataType).getFileInfo(dataType, id);
    }

    /**
     * 下载文件到本地文件。
     *
     * @param dataType 数据类型
     * @param id　文件ID
     * @param localFile 本地文件
     * @throws IOException
     */
    public static void downloadFile(String dataType, String id, File localFile)
            throws IOException
    {
        getFileManager(dataType).downloadFile(dataType, id, localFile);
    }

    /**
     * 下载文件到输出流中.
     *
     * @param dataType 数据类型
     * @param id　文件ID
     * @param os 输出流
     * @throws IOException IO异常
     */
    public static void downloadFile(String dataType, String id, OutputStream os)
            throws IOException
    {
        getFileManager(dataType).downloadFile(dataType, id, os);
    }

    /**
     * 下载文件到输出流中.
     *
     * @param dataType 数据类型
     * @param id　文件ID
     * @param os 输出流
     * @throws IOException IO异常
     */
    public static void downloadFile(String dataType, String id, OutputStream os, long offset, long length)
            throws IOException
    {
        getFileManager(dataType).downloadFile(dataType, id, os, offset, length);
    }

    /**
     * 下载文件到本地文件。
     *
     * @param info 文件信息
     * @param localFile 本地文件
     * @throws IOException
     */
    public static void downloadFile(VFileInfo info, File localFile)
            throws IOException
    {
        getFileManager(info.getDataType()).downloadFile(info, localFile);
    }

    /**
     * 删除文件。
     *
     * @param dataType 数据类型
     * @param id 文件标识
     * @return 文件信息
     * @throws IOException
     */
    public static VFileInfo removeFile(String dataType, String id)
            throws IOException
    {
        return getFileManager(dataType).removeFile(dataType, id);
    }

    /**
     * 无异常删除文件。
     *
     * @param dataType 数据类型
     * @param id 文件标识
     * @return 文件信息
     */
    public static VFileInfo removeFileQuitely(String dataType, String id)
    {
        return getFileManager(dataType).removeFileQuitely(dataType, id);
    }

    /**
     * 获取VFILE的访问URI。
     *
     * @param type 文件类型
     * @param id 文件标识
     * @return 文件访问URI.
     */
    public static String getVFileURI(String type, String id)
    {
        return getURIGetter().getVFileURI(type, id);
    }
}
